<?php

namespace App\Controller;

use Cake\ORM\TableRegistry;
use Cake\Event\Event;

class AprovacoesController extends AppController {

    public $components = ['Url', 'Flash', 'Email', 'RequestHandler'];
    public $helpers = ['Link'];
    public $readOnly = true;

    public function isAuthorized($user = null) {
        $role = isset($user['role']) ? $user['role'] : "";
        if (empty($role)) {
            return false;
        }
        if ($role == "admin") {
            $this->readOnly = false;
            return true;
        }
        $action = $this->request->action;
        if ($role == "focal") {
            if (in_array($action, ['index', 'aprovar', 'rejeitar', 'detalhes', 'rejeitadas', 'aprovar_rejeitada', 'downloadImage'])) {
                $this->readOnly = false;
                return true;
            }
            if (in_array($action, ['aguardando', 'publicadas', 'aprovados', 'aprovadas', 'finalizados', 'downloadImage'])) {
                return true;
            }
        } else if ($role == "publicador") {
            if (in_array($action, ['index', 'aprovados', 'detalhes', 'rejeitadas', 'aprovadas', 'finalizados', 'downloadImage'])) {
                return true;
            }
            if (in_array($action, ['aguardando', 'publicadas', 'publicar', 'downloadImage'])) {
                $this->readOnly = false;
                return true;
            }
        }
        return false;
    }

    public function beforeRender(Event $event) {
        parent::beforeFilter($event);
        $this->set('readOnly', $this->readOnly);
    }

    public function index() {
        $params = $this->configParams($this->request->query);

        $emissorasTable = TableRegistry::get('Emissoras');
        $query = $emissorasTable->find('pendentes', ['options' => ['conditions' => $params]]);

        $this->loadComponent('Paginator');
        $emissoras = $this->Paginator->paginate($query, [ 'limit' => 10]);
        $this->set(compact('emissoras', 'params'));
    }

    public function aprovar($id) {
        $emissoras = TableRegistry::get('Emissoras');
        $emissora = $emissoras->get($id);
        if ($this->request->is('post')) {
            $emissoras->connection()->transactional(function () use ($emissoras, $id) {
                $emissora = $emissoras->get($id);
                $emissora->aprovar();
                $emissoras->save($emissora, ['validate' => false, 'atomic' => false]);
                $user = \App\Model\Entity\User::CriarUsuarioEmissora($id);
                $assunto = 'Bem vindo ao Projeto Mobilize-se. Pré-cadastro efetuado com sucesso';
                $this->Email->sendEmail(['emissora' => $emissora, 'user' => $user], 'aprovado', $assunto);
            });
            $this->Flash->success('Emissora aprovada com sucesso');
            return $this->redirect(['action' => 'index']);
        }
        $this->set(compact('emissora'));
    }

    public function aprovar_rejeitada($id) {
        if ($this->request->is('post')) {
            $emissoras = TableRegistry::get('Emissoras');

            $emissoras->connection()->transactional(function () use ($emissoras, $id) {
                $emissora = $emissoras->get($id);
                $motivo = isset($this->request->data['motivo']) ? $this->request->data['motivo'] : null;
                $emissora->aprovar_reprovada($motivo);
                $result = $emissoras->save($emissora, ['validate' => 'aprovar']);

                if ($result) {
                    $user = \App\Model\Entity\User::CriarUsuarioEmissora($id);
                    $assunto = 'Bem vindo ao Projeto Mobilize-se. Pré-cadastro efetuado com sucesso';
                    $this->Email->sendEmail(['emissora' => $emissora, 'user' => $user], 'aprovado', $assunto);
                    $this->Flash->success('Emissora aprovada com sucesso');
                }

                $reponse = ['success' => $result != false, 'errors' => $emissora->errors()];
                $this->set('response', $reponse);
                $this->set('_serialize', ['response']);

                $this->RequestHandler->renderAs($this, 'json');
            });
        }
    }

    public function rejeitar($id) {
        if ($this->request->is('post')) {
            $emissoras = TableRegistry::get('Emissoras');
            $emissora = $emissoras->get($id);
            $motivo = isset($this->request->data['motivo']) ? $this->request->data['motivo'] : null;
            $emissora->rejeitar($motivo);
            $result = $emissoras->save($emissora, ['validate' => 'reprovar']);

            if ($result) {
                $assunto = 'Projeto Mobilize-se. Por favor reveja seu cadastro';
                $this->Email->sendEmail(['emissora' => $emissora], 'rejeitado', $assunto);
                $this->Flash->success('Emissora reprovada com sucesso');
            }

            $reponse = ['success' => $result != false, 'errors' => $emissora->errors()];
            $this->set('response', $reponse);
            $this->set('_serialize', ['response']);

            $this->RequestHandler->renderAs($this, 'json');
        }
    }

    public function aprovadas() {
        $params = $this->configParams($this->request->query);

        $emissorasTable = TableRegistry::get('Emissoras');
        $query = $emissorasTable->find('aprovadasTotal', ['options' => ['conditions' => $params]]);
        $this->loadComponent('Paginator');
        $emissoras = $this->Paginator->paginate($query, [ 'limit' => 10]);
        $this->set(compact('emissoras', 'params'));
    }

    public function aprovados() {
        $params = $this->configParams($this->request->query);

        $emissorasTable = TableRegistry::get('Emissoras');
        $query = $emissorasTable->find('aprovadas', ['options' => ['conditions' => $params]]);
        $this->loadComponent('Paginator');
        $emissoras = $this->Paginator->paginate($query, [ 'limit' => 10]);
        $this->set(compact('emissoras', 'params'));
    }

    public function rejeitadas() {
        $params = $this->configParams($this->request->query);

        $emissorasTable = TableRegistry::get('Emissoras');
        $query = $emissorasTable->find('rejeitadas', ['options' => ['conditions' => $params]]);
        $this->loadComponent('Paginator');
        $emissoras = $this->Paginator->paginate($query, [ 'limit' => 10]);
        $this->set(compact('emissoras', 'params'));
    }

    public function detalhes($id) {
        $emissoras = TableRegistry::get('Emissoras');
        $emissora = $emissoras->get($id);
        $situacoes = TableRegistry::get('Situacoes');
        $situacao = $situacoes->get($emissora['situacao_id']);
        $this->set(compact('emissora', 'situacao'));
    }

    public function downloadImage(){
        
        $imagem = $_GET['imagem'];
		
	$tamanho  = filesize($imagem);
	$extensao = substr($imagem, -3);
	
	if($extensao == 'png'){		
		header("Content-Type: application/save"); 
		header("Content-Length: " . $tamanho);
		header("Content-Disposition: attachment; filename=" . $imagem); 
		header("Content-Transfer-Encoding: binary");
	
		$fp = fopen($imagem, "r"); 
		fpassthru($fp); 
		fclose($fp);
	} else {
		echo "Ops! Voce nao pode fazer isso!";
		return false;	
	}
    }
    
    public function finalizados() {
        $params = $this->configParams($this->request->query);

        $emissorasTable = TableRegistry::get('Emissoras');
        $query = $emissorasTable->find('finalizadas', ['options' => ['conditions' => $params]]);
        $this->loadComponent('Paginator');
        $emissoras = $this->Paginator->paginate($query, [ 'limit' => 10]);
        $this->set(compact('emissoras', 'params'));
    }

    public function aprovarFinal($id) {
        $emissoras = TableRegistry::get('Emissoras');
        $emissora = $emissoras->get($id);

        if ($this->request->is('post')) {
            $emissoras = TableRegistry::get('Emissoras');
            $emissora = $emissoras->get($id);
            if ($emissora['situacao_id'] != \App\Model\Entity\Situacao::Finalizada) {
                $url = $this->Url->urlWithReturnUrl($this->request, array('action' => 'detalhes', $emissora->id), true, false);
                return $this->redirect($url);
            }
            $emissoras->patchEntity($emissora, $this->request->data, [
                'fieldList' => ['endereco', 'endereco_complemento', 'bairro', 'cep',
                    'grupo_rede', 'website',
                    'proprietario', 'email_proprietario', 'celular_proprietario', 'emissora_ativa',
                    'data_ativacao', 'data_inativacao', 'emissora_admimplente', 'data_ultimo_pagamento',
                    'nome_empresa', 'palavra_chave', 'texto_rotativo', 'mensagem_compartilhamento',
                    'facebook', 'link_integracao_programacao', 'latitude', 'longitude',
                    'nome_provedor_streaming', 'streaming', 'twitter', 'link_rds']]);

            $emissora->set('data_ativacao', $this->request->data['data_ativacao']);
            $emissora->set('data_inativacao', $this->request->data['data_inativacao']);
            $emissora->set('data_ultimo_pagamento', $this->request->data['data_ultimo_pagamento']);

            $result = $emissoras->save($emissora, ['validate' => 'alterar']);
            if ($result) {
                $result = $emissoras->saveLogo($emissora, $this->request->data['submittedfile']);
                if ($result) {
                    $result = $emissoras->save($emissora);
                }
            }
            if (!$result) {
                $errors = $emissora->errors();
                $this->set(compact('errors', 'emissora'));
                return;
            }

            if ($this->request->data['aprovar'] == 'false') {
                $errors = array();
                $this->set(compact('errors', 'emissora'));
                $this->Flash->success('Emissora alterada com sucesso');
            } else {
                $emissoras->connection()->transactional(function ($connection) use ($emissoras, $id) {
                    $emissora = $emissoras->get($id);
                    $emissora->aguardar();

                    $this->integrar($connection, $emissora);

                    $emissoras->save($emissora, ['validate' => false, 'atomic' => false]);
                    $this->Flash->success('Emissora aprovada com sucesso');
                    $assunto = 'Projeto Mobilize-se. Sua emissora está aprovada e disponível no aplicativo';
                    $this->Email->sendEmail(['emissora' => $emissora], 'aguardando', $assunto);
                    return $this->redirect(['action' => 'aguardando']);
                });
            }
        }

        $errors = array();
        $this->set(compact('errors', 'emissora'));
    }

    public function aguardando() {
        $params = $this->configParams($this->request->query);

        $emissorasTable = TableRegistry::get('Emissoras');
        $query = $emissorasTable->find('aguardando', ['options' => ['conditions' => $params]]);
        $this->loadComponent('Paginator');
        $emissoras = $this->Paginator->paginate($query, [ 'limit' => 10]);

        $this->set(compact('emissoras', 'params'));
    }

    public function publicadas() {
        $params = $this->configParams($this->request->query);

        $emissorasTable = TableRegistry::get('Emissoras');
        $query = $emissorasTable->find('publicadas', ['options' => ['conditions' => $params]]);
        $this->loadComponent('Paginator');
        $emissoras = $this->Paginator->paginate($query, [ 'limit' => 10]);

        $this->set(compact('emissoras', 'params'));
    }

    public function publicar($id) {

        $emissoras = TableRegistry::get('Emissoras');
        $emissora = $emissoras->get($id);
        if ($this->request->is('post')) {

            $emissora->set('url_loja_ios', $this->request->data['url_loja_ios']);
            $emissora->set('url_loja_android', $this->request->data['url_loja_android']);

            $result = $emissoras->save($emissora, ['validate' => 'publicar']);
            if (!$result) {
                $errors = $emissora->errors();
                $this->set(compact('errors', 'emissora'));
                return;
            }

            $emissora->publicar();
            $emissoras->save($emissora, ['validate' => false]);
            
            $assunto = 'Projeto mobilize-se: seu aplicativo está publicado!';
            $this->Email->sendEmail(['emissora' => $emissora], 'publicada', $assunto);
            $this->Flash->success('Emissora alterada com sucesso:');
        }
        $errors = array();
        $this->set(compact('errors', 'emissora'));
    }

    //public function email() {
    //    $emissoras = TableRegistry::get('Emissoras');
    //    $emissora = $emissoras->get(4977);
    //    $assunto = 'Projeto mobilize-se: seu aplicativo está publicado!';
    //    $this->Email->sendEmail(['emissora' => $emissora], 'publicada', $assunto);
    //}


    private function integrar($connection, $emissora) {

        $empresas = TableRegistry::get('Empresas', ['connection' => $connection]);
        $empresa = $empresas->newFromEmissora($emissora);

        $empresas->save($empresa, ['atomic' => false]);

        $apps = TableRegistry::get('Apps', ['connection' => $connection]);
        $app = $apps->newFromEmpresaEmissora($empresa, $emissora);
        $apps->save($app, ['atomic' => false]);

        $integracaos = TableRegistry::get('Integrador', ['connection' => $connection]);
        $integracao = $integracaos->newFromApp($app);
        $integracaos->save($integracao, ['atomic' => false]);

        //TODO: Se a empresa estiver entre as 500, criar usuario
        //$usuarios = TableRegistry::get('Usuarios');
        //$usuairo = $usuarios->newFromEmpresaApp($empresa, $app);
        //$usuarios->save($usuario);
    }

    private function configParams($params) {
        $newArray = array();
        $newArray['codigo_abert'] = isset($params['codigo_abert']) ? $params['codigo_abert'] : null;
        $newArray['cpf_cnpj'] = isset($params['cpf_cnpj']) ? $params['cpf_cnpj'] : null;
        $newArray['cidade'] = isset($params['cidade']) ? $params['cidade'] : null;
        $newArray['razaosocial'] = isset($params['razaosocial']) ? $params['razaosocial'] : null;
        $newArray['nomefantasia'] = isset($params['nomefantasia']) ? $params['nomefantasia'] : null;


        $data = "data_entrada";
        $action = $this->request->action;
        switch ($action) {
            case "aprovadas":
            case "aprovados":
                $data = "data_aprovacao";
                break;
            case "rejeitadas":
                $data = "data_rejeicao";
                break;
            case "finalizados":
                $data = "data_finalizacao";
                break;
            case "aguardando":
                $data = "data_aguardar";
                break;
            case "publicadas":
                $data = "data_publicacao";
                break;
        }

        $newArray['data_inicial'] = isset($params['data_inicial']) ? $params['data_inicial'] : null;
        $newArray['data_final'] = isset($params['data_inicial']) ? $params['data_final'] : null;

        return $newArray;
    }

}
